Флаги не меняются.
Команда:
CALL procedure_name
Логика:
if FAR CALL (внешний сегмент) PUSH CS CS = dest_seg PUSH IP IP = dest_offset
CALL передает управление подпрограмме, которая может находиться как внутри текущего сегмента (NEAR-proc), так и вне его (FAR-proc). Этим двум типам CALL соответствуют две различные машинные команды, и команда RET возврата из подпрограммы должна соответствовать типу команды CALL (потенциальная возможность несоответствия возникает, когда подпрограмма и команда CALL ассемблируются раздельно).
Операнды | Такт байты (слова) | Обращения | Байты | Пример |
near-proc | 19(23) | 1 | 3 | CALL NEAR_PROC |
far-proc | 28(36) | 2 | 5 | CALL FAR_PROC |
память-указатель16 | 21(29)+EA | 2 | 2-4 | CALL PROC[SI] |
регистр-указатель16 | 16(24) | 1 | 2 | CALL AX |
память-указатель32 | 37(57)+EA | 4 | 2-4 | CALL [BX].ROUTINE |
Примечания:
Если подпрограмма находится в другом сегменте, то процессор засылает в стек сначала текущее значение CS, затем текущее значение IP (IP указывает на команду, следующую за командой CALL), а затем передает управление в подпрограмму. Если же подпрограмма находится в том же сегменте, то процессор засылает в стек сначала текущее значение IP (которое опять же указывает на команду, следующую за командой CALL), а затем передает управление в подпрограмму. CALL также может считать адрес подпрограммы из регистра или из памяти. Эта форма команды CALL называется косвенным вызовом.